package com.info.zhiduoduo.core.service;

import com.info.zhiduoduo.common.constants.SmartResult;
import com.info.zhiduoduo.common.exception.RollbackException;
import com.info.zhiduoduo.core.formbean.CheckLongTermSubProjectFormBean;
import com.info.zhiduoduo.core.formbean.ProjectCheckFormBean;
import com.info.zhiduoduo.core.service.payment.project.ProjectPaymentService;
import com.info.zhiduoduo.repository.dto.project.ProjectDto;
import com.info.zhiduoduo.repository.entity.company.CompanyProject;
import com.info.zhiduoduo.repository.entity.invoice.Invoice;
import com.info.zhiduoduo.repository.entity.order.TradeRecord;

import java.util.List;

public interface ZhiduoduoProjectService {

	/**
	 * 判断项目金额超过限额，计算服务费等
	 *
	 * @param project
	 */
	void checkProjectAmountBeforePublish(CompanyProject project);

	/**
	 * 在创建项目后，处理一些通用业务。
	 *
	 * @param project 此项目必须是已保存在数据库中了，即projectid有值
	 */
	void doAfterProjectCreated(CompanyProject project);

	/**
	 * 在项目删除或取消后，处理一些通用业务
	 *
	 * @param project
	 */
	void doAfterProjectDeletedOrCancelled(CompanyProject project);

	/**
	 * 发布项目
	 */
	SmartResult publishProject(CompanyProject project);

	/**
	 * 企业验收项目
	 *
	 * @param reqdata
	 * @return
	 */
	SmartResult checkProject(ProjectCheckFormBean reqdata) throws RollbackException;

	/**
	 * 验收长期项目的子项目
	 *
	 * @param reqdata
	 * @return
	 */
	SmartResult checkLongTermProject(CheckLongTermSubProjectFormBean reqdata);

	/**
	 * 处理项目验收完成，供微信端项目调用。企业验收项目并支付。
	 */
	SmartResult handleProjectCheckedAndPay(CompanyProject project);

	/**
	 * 处理项目款的支付， 代付给创客或仲裁返款给企业。
	 */
	SmartResult handleProjectPayment(CompanyProject project);

	/**
	 * 根据项目的支付方式, 返回对应的支付逻辑策略类
	 *
	 * @param project
	 * @return
	 */
	ProjectPaymentService getProjectPaymentService(CompanyProject project);

	SmartResult handleRepayUser(CompanyProject project);

	SmartResult handleRepayJiuge(CompanyProject project);

	/**
	 * 线下项目支付后,处理创客流水,合伙人佣金
	 *
	 * @param invoice
	 */
	void handleOfflineProjectPaidFinish(Invoice invoice);

	/**
	 * 项目结束,处理资金流水,通知创客相关信息
	 *
	 * @param project
	 */
	void handleUserProjectAccountFlow(CompanyProject project, int tradeid);

	/**
	 * 支付给创客的代付交易成功了，处理后续步骤
	 *
	 * @param trade
	 */
	void doAfterPayUserTradeSucceed(TradeRecord trade);

	/**
	 * 代付给九歌平台成功后，处理后续的步骤
	 *
	 * @param trade
	 */
	void doAfterPayJiugeTradeSucceed(TradeRecord trade);

	/**
	 * 项目款已经成功交易给创客后,发送通知
	 *
	 * @return 处理成功, 则返回正常, 否则返回错误状态
	 */
	void handleCompanyOrderAfter(CompanyProject project);

	ProjectDto getProjectDetail(int projectid);

	/**
	 * 获取这笔项目,企业支付给创客项目款的交易记录
	 *
	 * @param projectid
	 * @return
	 */
	TradeRecord getCompanyPayUserAmountTradeRecord(int projectid);

//	/**
//	 * 获取这笔项目,企业支付给九歌(税费+服务费+合伙人佣金)的开联通交易记录
//	 *
//	 * @param projectid
//	 * @return
//	 */
//	TradeRecord getCompanyPayJiugeChargeTradeRecord(int projectid);
//
//	/**
//	 * 获取项目应该支付给九歌平台的手续费.调用此方法时,项目的服务费和税费都已经确定好,否则计算不准确.
//	 *
//	 * @param project
//	 * @return
//	 */
//	BigDecimal getPayJiugeCharge(CompanyProject project);
//
//	/**
//	 * 获取项目足以支付平台手续费的最低项目金额
//	 *
//	 * @param project
//	 * @return
//	 */
//	BigDecimal getProjectMinimumAmount(CompanyProject project);

}
